Clean up management of 'initial images' temporary buffers.
authorkaf24@firebug.cl.cam.ac.uk <kaf24@firebug.cl.cam.ac.uk>
Tue, 28 Feb 2006 10:58:45 +0000 (11:58 +0100)
committerkaf24@firebug.cl.cam.ac.uk <kaf24@firebug.cl.cam.ac.uk>
Tue, 28 Feb 2006 10:58:45 +0000 (11:58 +0100)
Avoid double-freeing boundary pages.

Signed-off-by: Anthony Xu <anthony.xu@intel.com>
Signed-off-by: Keir Fraser <keir@xensource.com>
xen/arch/x86/domain_build.c
xen/arch/x86/setup.c

index f60ac47fc68be162d2cdacd36bd9d92658b3886d..1a80aeb36f07c25e7c8dd304d29e775e9e4c9f20 100644 (file)
@@ -28,6 +28,9 @@
 
 #include <public/version.h>
 
+extern unsigned long initial_images_nrpages(void);
+extern void discard_initial_images(void);
+
 static long dom0_nrpages;
 
 /*
@@ -249,9 +252,6 @@ int construct_dom0(struct domain *d,
     uint32_t dom0_features_supported[XENFEAT_NR_SUBMAPS] = { 0 };
     uint32_t dom0_features_required[XENFEAT_NR_SUBMAPS] = { 0 };
 
-    extern void translate_l2pgtable(
-        struct domain *d, l1_pgentry_t *p2m, unsigned long l2mfn);
-
     /* Sanity! */
     BUG_ON(d->domain_id != 0);
     BUG_ON(d->vcpu[0] == NULL);
@@ -272,18 +272,14 @@ int construct_dom0(struct domain *d,
      */
     if ( dom0_nrpages == 0 )
     {
-        dom0_nrpages = avail_domheap_pages() +
-            ((initrd_len + PAGE_SIZE - 1) >> PAGE_SHIFT) +
-            ((image_len  + PAGE_SIZE - 1) >> PAGE_SHIFT);
+        dom0_nrpages = avail_domheap_pages() + initial_images_nrpages();
         dom0_nrpages = min(dom0_nrpages / 16, 128L << (20 - PAGE_SHIFT));
         dom0_nrpages = -dom0_nrpages;
     }
 
     /* Negative memory specification means "all memory - specified amount". */
     if ( dom0_nrpages < 0 )
-        nr_pages = avail_domheap_pages() +
-            ((initrd_len + PAGE_SIZE - 1) >> PAGE_SHIFT) +
-            ((image_len  + PAGE_SIZE - 1) >> PAGE_SHIFT) +
+        nr_pages = avail_domheap_pages() + initial_images_nrpages() +
             dom0_nrpages;
     else
         nr_pages = dom0_nrpages;
@@ -705,16 +701,12 @@ int construct_dom0(struct domain *d,
         hypercall_page_initialise((void *)hypercall_page);
     }
 
-    init_domheap_pages(
-        _image_start, (_image_start+image_len+PAGE_SIZE-1) & PAGE_MASK);
-
-    /* Copy the initial ramdisk and free temporary buffer. */
+    /* Copy the initial ramdisk. */
     if ( initrd_len != 0 )
-    {
         memcpy((void *)vinitrd_start, initrd_start, initrd_len);
-        init_domheap_pages(
-            _initrd_start, (_initrd_start+initrd_len+PAGE_SIZE-1) & PAGE_MASK);
-    }
+
+    /* Free temporary buffers. */
+    discard_initial_images();
 
     /* Set up start info area. */
     si = (start_info_t *)vstartinfo_start;
index 58c143d8a17013aeab1e1b1da4996559cca82bf7..ae73fe6ca94ee9e808a5b906e7e5eb7201f841b9 100644 (file)
@@ -144,6 +144,20 @@ static void __init do_initcalls(void)
 
 static struct e820entry e820_raw[E820MAX];
 
+static unsigned long initial_images_start, initial_images_end;
+
+unsigned long initial_images_nrpages(void)
+{
+    unsigned long s = initial_images_start + PAGE_SIZE - 1;
+    unsigned long e = initial_images_end;
+    return ((e >> PAGE_SHIFT) - (s >> PAGE_SHIFT));
+}
+
+void discard_initial_images(void)
+{
+    init_domheap_pages(initial_images_start, initial_images_end);
+}
+
 void __init __start_xen(multiboot_info_t *mbi)
 {
     char *cmdline;
@@ -152,7 +166,6 @@ void __init __start_xen(multiboot_info_t *mbi)
     unsigned int initrdidx = 1;
     module_t *mod = (module_t *)__va(mbi->mods_addr);
     unsigned long nr_pages, modules_length;
-    unsigned long initial_images_start, initial_images_end;
     paddr_t s, e;
     int i, e820_warn = 0, e820_raw_nr = 0, bytes = 0;
     struct ns16550_defaults ns16550 = {